/*********************************************************************************
FileName: TheBuffer.h

Description: header pour les fonctions de service du pilote. Ces fonctions seront
			 disponibles pour les usagers. Le header contien les macros
			 d'initialisation de module et de liberation de celui-ci.
			 Les details sur le struct file_operations et declaration de variables
			 globales.

Authors: Vincent Leger et Francisco Jesus Ramos Reyes

Last Modification: 28-10-2012

Modifications: --
*********************************************************************************/

#ifndef _THEBUFFER_H_
#define _THEBUFFER_H_

#include "includes.h"
#include "RingBuffCore.h"

/*****************************GLOBALS*******************************************/
int Buffer_major;
int Buffer_minor;
int nbDevices;
struct class *BufferClass;

/****************************TYPE DEFINITIONS***********************************/

/*********************************************************************************
Function name : static int __init buf_init(void)
Brief: Initialise le module TheBuffer et alloue de la memoire
	   pour les tempons utilises.
-Initialisation des structures personnelles;
-Allocation d’un MAJOR/MINOR;
-Création du char driver (cdev);
-Création de la classe et du device.

Inputs: pas de Inputs (void)
Outputs: pas de Outputs
Return value: static int --> utilise pour le retour de code d'erreur

Last modified: 28-10-2012
notes: exemple d'utilisation et call out -- module_init(buf_init);
*********************************************************************************/
static int buf_init(void);

/*********************************************************************************
Function name : static void __exit buf_exit(void)
Brief: Libere la memoire et detruit le module TheBuffer.
-deallocation du MAJOR/MINOR;
-detruit le char driver (cdev);
-detruit la classe et le device.

Inputs: pas de Inputs (void)
Outputs: pas de Outputs
Return value: static int --> utilise pour le retour de code d'erreur

Last modified: 28-10-2012
notes: exemple d'utilisation et call out -- module_exit(buf_exit);
*********************************************************************************/
static void buf_exit(void);

/*********************************************************************************
Function name : int buf_open(struct inode *inode, struct file *filp)

Brief: -Utilise par l'usage pour ouvrire le pilote et pouvoir utiliser ses
		fonctionalites a traver la structure file_operations.
	   -Dans cette fonction l'usage indique le mode d'ouverture et determine
	    ainsi les fonctions auquel il a le droit d'acceder.
	   -Initialiser l'uinite-materiel lorsqu'elle est ouverte pour la
	    premiere fois.

Inputs: struct inode -->Pointeurs de fonctions pour le noyau
		struct file  -->Pointeurs de fonctions pour les usages
Outputs: Int
Return value: int --> utilise pour le retour de code d'erreur

Last modified: 28-10-2012
notes: exemple d'utilisation et call out -- fd = open("/dev/TheBuffer", O_RDWR);
*********************************************************************************/
int buf_open(struct inode *inode, struct file *flip);

/*********************************************************************************
Function name : int buf_release(struct inode *inode, struct file *filp)

Brief: -Utilise par l'usage pour liberer le pilote quan il n'a plus besoin
		de ses services.
	   -Arrete le materiel a la derniere liberation.

Inputs: struct inode -->Pointeurs de fonctions pour le noyau
		struct file  -->Pointeurs de fonctions pour les usages
Outputs: Int
Return value: int --> utilise pour le retour de code d'erreur

Last modified: 28-10-2012
notes: exemple d'utilisation et call out -- close(fd);
*********************************************************************************/
int buf_release(struct inode *inode, struct file *flip);

/*********************************************************************************
Function name : ssize_t buf_read(struct file *filp, char __user *ubuf,
                    size_t count, loff_t *f_ops)
Brief: -Quand l'usage veut des donnees du materiel, c'est cette fonction
		qui est appele.

Inputs: struct file  	  -->Pointeurs de fonctions pour les usages
		char __user *ubuf -->Pointeur de la destination ou le data sera copie
		size_t count	  -->Qte de data qui sera copie
		loff_t *f_ops	  -->
Outputs: ssize_t --> Qte de data copie avec succes
Return value: ssize_t --> Qte de data copie avec succes

Last modified: 28-10-2012
notes: exemple d'utilisation et call out -- read(fd, TestBufferIn, CHAR_NUM);
*********************************************************************************/
ssize_t buf_read(struct file *flip, char __user *ubuf,
					size_t count, loff_t *f_ops);

/*********************************************************************************
Function name : ssize_t buf_write(struct file *filp, const char __user *ubuf,
                    size_t count, loff_t *f_ops)
Brief: -Quand l'usage veut envoyer des donnees au materiel, c'est cette fonction
		qui est appele.

Inputs: struct file  	  -->Pointeurs de fonctions pour les usages
		char __user *ubuf -->Pointeur de la source qui sera copie
		size_t count	  -->Qte de data qui sera copie
		loff_t *f_ops	  -->
Outputs: ssize_t --> Qte de data copie avec succes
Return value: ssize_t --> Qte de data copie avec succes

Last modified: 28-10-2012
notes: exemple d'utilisation et call out -- write(fd, TestBufferOut, CHAR_NUM);
*********************************************************************************/
ssize_t buf_write(struct file *flip, const char __user *ubuf,
					size_t count, loff_t *f_ops);

/*********************************************************************************
Function name :long buf_ioctl (struct file *filp,
								unsigned int cmd, unsigned long *arg)

Brief: -Fonction utilise pour envoyer differentes commandes au materiel.

Inputs: struct file  	   -->Pointeurs de fonctions pour les usages
		unsigned long *arg -->Pointeur pour espace d'echange de donnee entre
							  l'usager et le pilote.
		unsigned int cmd   -->Commande envoye par l'usager

Outputs: long --> Qte de data copie avec succes
Return value: long --> utilise pour le retour de code d'erreur

Last modified: 28-10-2012
notes: exemple d'utilisation et call out -- ioctl(fd, THEBUFFER_IOCTL_GET_QTY_DATA
												  , &QtyData);
*********************************************************************************/
long buf_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);

/**********************************STRUCT**************************************/
struct file_operations Buf_fops = {
	.owner			=	THIS_MODULE,
	.open			=	buf_open,
	.release		=	buf_release,
	.read			=	buf_read,
	.write			=	buf_write,
	.unlocked_ioctl =   buf_ioctl,
};

/************************************MACROS************************************/
module_init(buf_init);
module_exit(buf_exit);



#endif /* _THEBUFFER_H_ */
